package util.form.respuesta;

import java.util.List;

import util.android.window.OnAceptarCancelarListener;
import util.form.CuestionarioContext;
import util.form.pregunta.Restriccion0;
import util.form.respuesta.listener.OnGuardarRegistroListener;
import util.form.respuesta.listener.OnInputInvalidoListener;

public class Formulario 
extends GrupoInput
{	
	private final CuestionarioContext context;
	
	private OnGuardarRegistroListener onGuardarListener;
	
	//restriccion del formulario, para guardar inputs
	private Restriccion0 restriccion;
	
	public Formulario(CuestionarioContext context) {
		this.context = context;
	}
	
	@Override
	protected void postAgregar(Input input) {
		input.setContext(context);
	}
	
	public void update(RegistroImpl r) throws Exception {
		List<Input> inputs = getInputsTotal();
		for(Input input : inputs) {
			if(input instanceof Input1) {
				Input1 in = (Input1) input;
				if(in.getPregunta().getNombre()!=null) {
					String v = r.getValorString(in.getPregunta().getNombre());
					if(v!=null)//para evitar setear nulo
						in.setValor(v);
				}
			}
			else if(input instanceof Input2) {
				Input2 in = (Input2) input;
				Input1 in1 = in.getInput1();
				Input1 in2 = in.getInput2();
				if(in1.getPregunta().getNombre()!=null && in2.getPregunta().getNombre()!=null) {
					String v1 = r.getValorString(in1.getPregunta().getNombre());
					String v2 = r.getValorString(in2.getPregunta().getNombre());
					v1 = (v1==null?"":null);//para evitar setear nulo
					v2 = (v2==null?"":null);//para evitar setear nulo
					in.setValor(v1,v2);
				}
			}
		}
	}
			

		
	//////////////////////////////////////////////////
	
	
	public final boolean guardar() throws Exception {
		if(onGuardarListener==null)
			throw new Exception("onGuardarListener nulo");
		
		if(validar()) {
			guardarSinValidar();		
			return true;
		}
		return false;
	}
	
	public final void guardarSinValidar() throws Exception {
		if(onGuardarListener==null)
			throw new Exception("onGuardarListener nulo");
		
		
		boolean guardar1 = false;
		RegistroImpl r = getRegistro();
		if(!r.isVacio()) {
			onGuardarListener.onGuardar(r);
			guardar1 = true;
		}
		
		boolean guardar2 = false;
		if(onPostGuardar())
			guardar2 = true;
		
		if(guardar1 || guardar2)
			context.mostrarMensaje("GUARDADO");		
	}
	
	public boolean preguntarPorOmisiones(OnAceptarCancelarListener dialogAceptarCancelarListener) {
		//List<Input> inputs = this.inputs;
		List<Input> inputs = getInputsTotal();
		
		for(Input in : inputs) {
			if(in.isRelevante() && in.isExisteOmisionParaPreguntar()) {
				if(in.preguntarPorOmisiones(dialogAceptarCancelarListener))
					return true;
			}
		}
		return false;
	}
		
	
	public boolean validarInputs(OnInputInvalidoListener onInvalidoInput) throws Exception {
		List<Input> inputs = getInputsTotal();
		for(Input in : inputs) {
			if(in.isRelevante() && !in.isValido(onInvalidoInput)) {
				return false;
			}
		}
		return true;
	}
	
	private boolean validar() throws Exception {
		
		if(this.preguntarPorOmisiones(null))
			return false;
		
		if(this.restriccion!=null) {
			String msj = this.restriccion.validar();
			if(msj!=null) {
				context.mostrarMensaje(msj);
				return false;
			}
		}
		
		return validarInputs(new OnInputInvalidoListener() {
			@Override
			public void onInvalido(String mensaje) {
				context.mostrarMensaje(mensaje);
			}
		});
	}

	public OnGuardarRegistroListener getOnGuardarListener() {
		return onGuardarListener;
	}

	public void setOnGuardarListener(OnGuardarRegistroListener onGuardarListener) {
		this.onGuardarListener = onGuardarListener;
	}

	public Restriccion0 getRestriccion() {
		return restriccion;
	}

	public void setRestriccion(Restriccion0 restriccion) {
		this.restriccion = restriccion;
	}
	
	
}
